<?php
/**
 * @author 段志岩
 * @date 2008.8.14
 * @summary 此文件定义一些全局的公用的函数.
 */

/**
 * “变量消毒”函数。
 * 按照$signatrues中的定义，对$vars中的相应变量进行非空检查和类型检查
 *
 * @param $vars <array> 待检查的变量数组
 * @param $signatures <array> 变量限制条件，格式如下：
 * 	array(
 * 		'var_name' => array( 'required' => true, 'type' => 'int', 'function' => 'function_name'),
 * 		...
 * 		)
 * 	required定义该变量是否必须填写
 * 	type定义变量的类型
 * 	function指定一个函数，用于对该变量进行一定的操作，例如对字符串执行addslashes函数.
 */
function sanitize_vars(& $vars, $signatures)
{
	$tmp = array();
	foreach($signatures as $name => $sig)
	{
		if(($vars[$name] == "") &&
			isset($sig['required']) && $sig['required'])
		{
			return $name;
		}
		$tmp[$name] = $vars[$name];
		if(isset($sig['type']))
		{
			settype($tmp[$name], $sig['type']);
		}
		if(isset($sig['function']))
		{
			$tmp[$name] = $sig['function']($tmp[$name]);
		}
	}
	$vars = $tmp;
	return "";
}

/**
 * 取得类的实例。
 *
 * @param $className <string> 类名称。该类必须存在一个无参数的构造函数。
 * @return 类的一个实例。若类不存在则返回null.
 */
function get_instance_of($className)
{
	if(class_exists($className))
	{
		$o = new $className();
	}else{
		E('page_not_found');
	}
	return $o;
}
function get_action_instance($className)
{
	return get_instance_of($className . "Action");
}

function __load($dirname)
{
	$d = opendir($dirname);
	while(false !== ($file = readdir($d)))
	{
		if($file == "." || $file == "..")
			continue;
		$fullname = $dirname . "/" . $file;
		if(is_dir($fullname))
		{
			//__load($fullname);
		}else{
			if(substr($fullname, strlen($fullname)-4, strlen($fullname)) == ".php")
			{
				require_once $fullname;
			}
		}
	}
	closedir($d);
}

/**
 * 发生致命错误，显示错误信息并终止程序运行
 * 
 * @param $errorID <int> 错误号
 */
function E($errorID)
{
	global $gSmarty;
	global $errors;

	$gSmarty->assign("errorMsg", $errors[$errorID]);
	$gSmarty->display("error.tpl");
	exit(1);
}

/**
 * 从数组中取出两个字段，组成HTML中select元素的options。
 *
 * @param $array <array> 待选数组
 * @param $value_field <string> 作为option的value的字段名称
 * @param $output_field <string> 作为option的输出的字段名称
 * 
 * @return <array> 以$value_field的值为索引，以$output_field的值为值的数组.
 */

function fetchOptions($array, $value_field, $output_field)
{
	if(is_array($array) && count($array) > 0)
	{
		$r = array();
		foreach($array as $item)
		{
			$r[$item[$value_field]] = $item[$output_field];
		}
		return $r;
	}
	return array();
}
?>
